package logica;

import logica.persistencia.EntidadRolPersistente;
import memento.EstadoGuardable;
import memento.IMemento;
import memento.MementoEntidadRolLogica;


public class EntidadRol implements EstadoGuardable {

	private Entidad entidad;
	private String rol;
	private int cardinalidadMin;
	private int cardinalidadMax;
	
	private static final String CARDINALIDAD_MAXIMA_STR = "n";
	private static final int CARDINALIDAD_MAXIMA_INT = -1;
		
	public EntidadRol(Entidad entidad) 
	{
		this(entidad, "", 1, CARDINALIDAD_MAXIMA_INT);
	}
	
	public EntidadRol(Entidad entidad, String rol, int cardinalidadMin, int cardinalidadMax) 
	{
		this.setEntidad(entidad);
		this.setRol(rol);
		this.setCardinalidadMin(cardinalidadMin);
		this.setCardinalidadMax(cardinalidadMax);
	}
	
	public EntidadRol(EntidadRol entidadRol) {
		this.actualizarEntidadRol(entidadRol);
	}

	public void actualizarEntidadRol(EntidadRol entidadRol)
	{
		this.setCardinalidadMax(entidadRol.getCardinalidadMax());
		this.setCardinalidadMin(entidadRol.getCardinalidadMin());
		this.setRol(entidadRol.getRol());
		this.setEntidad(entidadRol.getEntidad());
	}
	
	public void setRol(String rol) {
		this.rol = rol;
	}

	public String getRol() {
		return rol;
	}

	public void setCardinalidadMin(int cardinalidadMin) {
		this.cardinalidadMin = cardinalidadMin;
	}

	public int getCardinalidadMin() {
		return cardinalidadMin;
	}

	public void setCardinalidadMax(int cardinalidadMax) {
		this.cardinalidadMax = cardinalidadMax;
	}

	public int getCardinalidadMax() {
		return cardinalidadMax;
	}
	
	public void setCardinalidadMin(String cardinalidadMin) throws NumberFormatException
	{	
		if (esCardinalidadMaxima(cardinalidadMin))
			this.setCardinalidadMin(this.getValorCardinalidadMaximaInt());
		else
			this.setCardinalidadMin(new Integer(cardinalidadMin));
	}
	
	public void setCardinalidadMax(String cardinalidadMax)
	{
		if (esCardinalidadMaxima(cardinalidadMax))
			this.setCardinalidadMax(this.getValorCardinalidadMaximaInt());
		else
			this.setCardinalidadMax(new Integer(cardinalidadMax));
	}

	private boolean esCardinalidadMaxima(String cardinalidad) {
		return (cardinalidad.compareToIgnoreCase(CARDINALIDAD_MAXIMA_STR) == 0);
	}
	
	private int getValorCardinalidadMaximaInt() {
		return CARDINALIDAD_MAXIMA_INT;
	}
	
	public String getCardinalidadMinString()
	{
		if (this.getCardinalidadMin() == this.getValorCardinalidadMaximaInt())
			return CARDINALIDAD_MAXIMA_STR;
		
		return Integer.toString(this.getCardinalidadMin());
	}

	public String getCardinalidadMaxString() 
	{
		if (this.getCardinalidadMax() == this.getValorCardinalidadMaximaInt())
			return CARDINALIDAD_MAXIMA_STR;
		
		return Integer.toString(this.getCardinalidadMax());
	}

	public void setEntidad(Entidad entidad) {
		this.entidad = entidad;
	}

	public Entidad getEntidad() {
		return entidad;
	}
	
	public boolean equals(Object entidadRol)
	{
		EntidadRol entidad = (EntidadRol) entidadRol;
		
		if (!entidad.getEntidad().equals(this.getEntidad()))
			return false;
		
		return entidad.getRol().compareToIgnoreCase(this.getRol())==0;
	}
	
	public EntidadRolPersistente getEntidadRolPersistente() {
		return new EntidadRolPersistente(this);
	}

	public boolean tieneEstaEntidad(Entidad entidad) {
		return this.getEntidad() == entidad;
	}

	@Override
	public IMemento getMementoEspecializado() {
		return new MementoEntidadRolLogica(this);
	}

	@Override
	public void saveMemento(IMemento memento) {
		memento.cargarMemento();		
	}
	
	@Override
	public IMemento getMementoGenerico() {
		return this.getMementoEspecializado();
	}
}
